package main

import (
	"fmt"
	"strconv"
)

/*
根据 逆波兰表示法，求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数，也可以是另一个逆波兰表达式。

说明：

整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说，表达式总会得出有效数值且不存在除数为 0 的情况。

作者：力扣 (LeetCode)
链接：https://leetcode-cn.com/leetbook/read/queue-stack/gomvm/
来源：力扣（LeetCode）
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。

逆波兰表达式是一种后缀表达式，所谓后缀就是指算符写在后面。

平常使用的算式则是一种中缀表达式，如 ( 1 + 2 ) * ( 3 + 4 ) 。
该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

作者：力扣 (LeetCode)
链接：https://leetcode-cn.com/leetbook/read/queue-stack/gomvm/
来源：力扣（LeetCode）
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。

*/

func evalRPN(tokens []string) int {
	var stack []int64
	var tmpRes int64
	for _, s := range tokens {
		n, err := strconv.ParseInt(s, 10, 64)
		if err == nil {
			stack = append(stack, n)
			continue
		}
		switch s {
		case "+":
			tmpRes = stack[len(stack)-2] + stack[len(stack)-1]
		case "-":
			tmpRes = stack[len(stack)-2] - stack[len(stack)-1]
		case "*":
			tmpRes = stack[len(stack)-2] * stack[len(stack)-1]
		case "/":
			tmpRes = stack[len(stack)-2] / stack[len(stack)-1]
		}
		stack = stack[:len(stack)-2]
		stack = append(stack, tmpRes)
	}
	return int(stack[0])
}

func main() {
	// token := []string{"2", "1", "+", "3", "*"}
	token := []string{"10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"}
	fmt.Println(evalRPN(token))
}
